package com.gitee.ec.common;

import cn.hutool.core.io.file.FileReader;
import cn.hutool.core.io.file.FileWriter;
import cn.hutool.core.swing.DesktopUtil;
import lombok.Data;
import lombok.experimental.Accessors;

import java.io.File;
import java.util.Date;
import java.util.Objects;

/**
 * @author hongda.li
 */
@Data
@Accessors(chain = true)
public class FileInfo {
    /**
     * 文件标识
     */
    private Boolean fileFlag;

    /**
     * 目录标识
     */
    private Boolean directoryFlag;

    /**
     * 文件名称
     */
    private String fileName;

    /**
     * 文件所在目录路径
     */
    private String directoryPath;

    /**
     * 文件绝对路径
     */
    private String fileAbsolutePath;

    /**
     * 文件扩展名
     */
    private String extendName;

    /**
     * 文件大小
     */
    private Double fileSize;

    /**
     * 文件大小单位
     */
    private FileSizeUnit fileSizeUnit = FileSizeUnit.B;

    /**
     * 文件修改时间
     */
    private Date modifyDate;

    /**
     * 获取文件写入器
     *
     * @return 文件写入器
     */
    public FileWriter getFileWriter() {
        return new FileWriter(fileAbsolutePath);
    }

    /**
     * 获取文件读取器
     *
     * @return 文件读取器
     */
    public FileReader getFileReader() {
        return new FileReader(fileAbsolutePath);
    }

    /**
     * 根据文件绝对路径获取文件对象
     *
     * @return 文件对象
     */
    public File toFile() {
        Objects.requireNonNull(this.fileAbsolutePath);
        return new File(this.fileAbsolutePath);
    }

    /**
     * 使用系统默认方式打开文件或文件夹
     *
     * @return 当前文件
     */
    public FileInfo openWithSystem() {
        if (Boolean.TRUE.equals(this.fileFlag)) {
            DesktopUtil.open(this.toFile());
        } else {
            Objects.requireNonNull(this.directoryPath);
            DesktopUtil.open(new File(this.directoryPath));
        }
        return this;
    }

    public FileInfo processUnit(FileSizeUnit unit) {
        int rate = unit.getValue() - this.fileSizeUnit.getValue();
        if (rate == 0 || this.fileSize == null) {
            return this;
        }

        if (rate > 0) {
            this.fileSize = this.fileSize / Math.pow(1024, rate);
        } else {
            this.fileSize = this.fileSize * Math.pow(1024, Math.abs(rate));
        }

        return this;
    }

    public FileInfo processKb() {
        return this.processUnit(FileSizeUnit.KB);
    }

    public FileInfo processMb() {
        return this.processUnit(FileSizeUnit.MB);
    }

    public FileInfo processGb() {
        return this.processUnit(FileSizeUnit.GB);
    }

    public FileInfo processTb() {
        return this.processUnit(FileSizeUnit.TB);
    }
}
